﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;

namespace BLL.CSocket
{
    public class StructBytesConvert
    {
        ///   <summary>
        ///  将结构转换为字节数组
        ///   </summary>
        ///   <param name="obj"> 结构对象 </param>
        ///   <returns> 字节数组 </returns>
        public static byte[] StructToBytes(object obj)
        {
           
            // 得到结构体的大小
            int size = Marshal.SizeOf(obj);
            // 创建byte数组
            byte[] bytes = new byte[size];

            try
            {
                // 分配结构体大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                // 将结构体拷到分配好的内存空间
                Marshal.StructureToPtr(obj, structPtr, false);
                // 从内存空间拷到byte数组
                Marshal.Copy(structPtr, bytes, 0, size);
                // 释放内存空间
                Marshal.FreeHGlobal(structPtr);
                // 返回byte数组
            }
            catch (Exception ex)
            {
                Business.Common.WriteLog(string.Format("StructToBytes方法-结构转换到字节数组出现异常，对象内容：{0}，错误信息：{1}", obj.ToString(), ex.Message), "Error");
                return null;
            }
            return bytes;
        }

        ///   <summary> 
        ///  byte数组转结构
        ///   </summary>
        ///   <param name="bytes"> byte数组 </param>
        ///   <param name="type"> 结构类型 </param>
        ///   <returns> 转换后的结构 </returns> 
        public static object BytesToStruct(byte[] bytes, Type type)
        {
            object obj = null;
            try
            {
                // 得到结构的大小
                int size = Marshal.SizeOf(type);
                Business.Common.WriteLog(string.Format("msg:size={0}; bytes.Length={1}", size, bytes.Length), "Info");

                //Log(size.ToString(),  1 );
                // byte数组长度小于结构的大小
                if (size > bytes.Length)
                {
                    Business.Common.WriteLog(string.Format("size={0}; bytes.Length={1}",size,bytes.Length), "Info");
                    // 返回空
                    return null;
                }
                // 分配结构大小的内存空间
                IntPtr structPtr = Marshal.AllocHGlobal(size);
                // 将byte数组拷到分配好的内存空间
                Marshal.Copy(bytes, 0, structPtr, size);
                // 将内存空间转换为目标结构
                obj = Marshal.PtrToStructure(structPtr, type);
                // 释放内存空间
                Marshal.FreeHGlobal(structPtr);
            }
            catch (Exception ex)
            {
                Business.Common.WriteLog("BytesToStruct方法-字节数组转换为结构出现异常，异常信息：" + ex.Message, "Error");
            }
           
            // 返回结构 
            return obj;
        }
    }
}
